package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.manager.generico.ManagerPesquisarGenerico;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Cidade;
import br.com.foxinline.modelo.Coordenada;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.PrefeituraServico;
import br.com.foxinline.util.Conexao;
import br.com.foxinline.util.GrupoUtilitario;
import br.com.foxinline.util.Msg;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.security.DeclareRoles;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.Polyline;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
@DeclareRoles(GrupoUtilitario.ADMINISTRADOR)
public class ManagerPesquisarBairro extends ManagerPesquisarGenerico<Bairro> {

    @EJB
    BairroServico bairroServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    PrefeituraServico prefeituraServico;
    private Bairro bairro;
    private Bairro bairroDelete;
    private List<Bairro> bairros;
    private Cidade cidade;
    private Cidade visualizarCidade;
    private Bairro visualizarBairro;
    private String visBairro;
    private List<Coordenada> coordenadas;
    private DefaultMapModel mapModel;
    private String centroMapa;
    private int zoomLevelMapa;
    private boolean connect;

    @Override
    public void init() {
        setServico(bairroServico);

        this.bairro = new Bairro();
        this.cidade = new Cidade();
        this.bairros = new ArrayList<Bairro>();

        this.centroMapa = prefeituraServico.getCentroMapa();
        this.zoomLevelMapa = prefeituraServico.getZoomMapa();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.visBairro = params.get("visBairro");

        paramPost();

        if (prefeituraServico.find().getDesabilitarMapas()) {

            this.connect = false;
        } else if (!Conexao.isInternetReachable()) {

            this.connect = false;

            if (visBairro != null) {
                Msg.messagemWarn("Não foi possível estabelecer uma conexão com a Internet.");
            }
        } else if (coordenadas != null) {
            this.connect = true;
            plotar();
        }
    }

    public void plotar() {
        this.mapModel = new DefaultMapModel();
        LatLng coord;
        Polyline polyline = new Polyline();
        Double lat = .0, lng = .0;

        if (!coordenadas.isEmpty()) {
            for (Coordenada c : this.coordenadas) {
                coord = new LatLng(c.getLat(), c.getLog());

                lat += c.getLat();
                lng += c.getLog();

                polyline.getPaths().add(coord);
                polyline.setStrokeColor("#1B93DF");
                polyline.setStrokeWeight(2);

            }

            coord = new LatLng(this.coordenadas.get(0).getLat(), this.coordenadas.get(0).getLog());
            polyline.getPaths().add(coord);

            this.mapModel.addOverlay(polyline);

            this.centroMapa = lat / this.coordenadas.size() + ", " + lng / this.coordenadas.size();
            this.zoomLevelMapa = 15;
        }
    }

    @Override
    public void pesquisar() {
        this.bairro.setCidade(this.cidade);
        this.entidadePesquisar = this.bairro;

        getSearchResults().setFirst(0);
        onLoadModel();
    }

    public void paramPost() {
        try {
            if (this.visBairro != null) {
                this.visualizarBairro = bairroServico.find(Long.parseLong(this.visBairro));
                this.visualizarCidade = visualizarBairro.getCidade();
                this.coordenadas = bairroServico.lstCoordenadaBairro(this.visualizarBairro);
            }

        } catch (Exception e) {
            System.err.println(e);
        }
    }

    @Override
    public void limpar() {
        this.bairro = new Bairro();
        this.cidade = new Cidade();
    }

    @Override
    public void remover() {
        try {

//            this.bairroDelete.setAtivo(false);
            //bairroServico.update(this.bairroDelete);
            bairroServico.delete(bairroDelete);

        } catch (EJBAccessException e) {
            System.err.println(e);
            Msg.messagemWarn(Msg.PermissaoNegada);
        }
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public List<Bairro> getBairros() {
        return bairros;
    }

    public void setBairros(List<Bairro> bairros) {
        this.bairros = bairros;
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public Bairro getVisualizarBairro() {
        return visualizarBairro;
    }

    public void setVisualizarBairro(Bairro visualizarBairro) {
        this.visualizarBairro = visualizarBairro;
    }

    public DefaultMapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(DefaultMapModel mapModel) {
        this.mapModel = mapModel;
    }

    public Cidade getVisualizarCidade() {
        return visualizarCidade;
    }

    public void setVisualizarCidade(Cidade visualizarCidade) {
        this.visualizarCidade = visualizarCidade;
    }

    public String getCentroMapa() {
        return centroMapa;
    }

    public void setCentroMapa(String centroMapa) {
        this.centroMapa = centroMapa;
    }

    public int getZoomLevelMapa() {
        return zoomLevelMapa;
    }

    public void setZoomLevelMapa(int zoomLevelMapa) {
        this.zoomLevelMapa = zoomLevelMapa;
    }

    public Bairro getBairroDelete() {
        return bairroDelete;
    }

    public void setBairroDelete(Bairro bairroDelete) {
        this.bairroDelete = bairroDelete;
    }

    public boolean isConnect() {
        return connect;
    }

    public void setConnect(boolean connect) {
        this.connect = connect;
    }
}
